import os
from argparse import Namespace
import re
from os.path import join as pjoin


def is_float(numStr):
    flag = False
    numStr = str(numStr).strip().lstrip("-").lstrip("+")
    try:
        reg = re.compile(r"^[-+]?[0-9]+\.[0-9]+$")
        res = reg.match(str(numStr))
        if res:
            flag = True
    except Exception as ex:
        print("is_float() - error: " + str(ex))
    return flag


def is_number(numStr):
    flag = False
    numStr = str(numStr).strip().lstrip("-").lstrip("+")
    if str(numStr).isdigit():
        flag = True
    return flag


def get_opt(opt, opt_path):
    opt_dict = vars(opt)

    skip = (
        "-------------- End ----------------",
        "------------ Options -------------",
        "\n",
    )
    print("Reading", opt_path)
    with open(opt_path) as f:
        for line in f:
            if line.strip() not in skip:
                print(line.strip())
                key, value = line.strip().split(": ")
                if getattr(opt, key, None) is not None:
                    continue
                if value in ("True", "False"):
                    opt_dict[key] = True if value == "True" else False
                elif is_float(value):
                    opt_dict[key] = float(value)
                elif is_number(value):
                    opt_dict[key] = int(value)
                elif "," in value:
                    value = value[1:-1].split(",")
                    opt_dict[key] = [int(i) for i in value]
                else:
                    opt_dict[key] = str(value)

    opt.save_root = os.path.dirname(opt_path)
    opt.model_dir = pjoin(opt.save_root, "model")
    opt.meta_dir = pjoin(opt.save_root, "meta")

    if opt.dataset_name == "t2m" or opt.dataset_name == "humanml":
        opt.joints_num = 22
        opt.dim_pose = 263
        opt.max_motion_length = 196
        opt.radius = 4
        opt.fps = 20
    elif opt.dataset_name == "kit":
        opt.joints_num = 21
        opt.dim_pose = 251
        opt.max_motion_length = 196
        opt.radius = 240 * 8
        opt.fps = 12.5
    else:
        raise KeyError("Dataset not recognized")
